Tips&Tricks I trucchi del mestiere

 

Gli utenti cambiano la dimensione dei controlli


Grazie a due semplice chiamate ad API, Φ possibile mettere gli utenti in grado di ridimensionare i controlli presenti nelle applicazioni che realizziamo, in modo del tutto simile a quanto si fa nel Design Mode di Visual Basic 6: cliccando su un bordo, o su uno spigolo, e trascinandolo per ridefinire i contorni del controllo.
Il codice suppone che nella form principale sia presente una picture box (Picture1) e gestisce il caso del ridimensionamento orizzontale, ma Φ facilmente estensibile a tutti gli altri casi.
Tip fornito dal sig.R.Fabozzi

Private Declare Function ReleaseCapture Lib _
	"user32" () As Long
Private Declare Function SendMessage Lib _
	"user32" Alias "SendMessageA" (ByVal hWnd _
	As Long, ByVal wMsg As Long, ByVal wParam _
	As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1

Private Const HTLEFT = 10
Private Const HTRIGHT = 11
Private Sub Picture1_MouseDown(Button As _
	Integer, Shift As Integer, X As Single, Y As Single)
	Dim nParam As Long
	With Picture1
		' You can change these coordinates to whatever 
		' you want
		If (X > 0 And X < 100) Then
			nParam = HTLEFT
		ElseIf (X > .Width - 100 And X < .Width) Then 
		' these too
			nParam = HTRIGHT
		End If
		If nParam Then
			Call ReleaseCapture
			Call SendMessage(.hWnd, _
				WM_NCLBUTTONDOWN, nParam, 0)
		End If
	End With
End Sub
Private Sub Picture1_MouseMove(Button As _
	Integer, Shift As Integer, X As Single, Y As Single)
	Dim NewPointer As MousePointerConstants
	' You can change these coordinates to whatever you want
	If (X > 0 And X < 100) Then
		NewPointer = vbSizeWE
	ElseIf (X > Picture1.Width - 100 And X < _
		Picture1.Width) Then ' these too
		NewPointer = vbSizeWE
	Else
		NewPointer = vbDefault
	End If
	If NewPointer <> Picture1.MousePointer Then
		Picture1.MousePointer = NewPointer
	End If
End Sub



Leggere e scrivere in un file .INI


Il tip, inserito in un modulo BAS (o CLS), permette di leggere e scrivere informazioni nei file .INI, il tutto senza utilizzare complicate procedure di ricerca all'interno di un file, ma utilizzando le API di Windows.
Tip fornito dal sig. S.Tomaselli

Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" 
ByVal lpApplicationname As String, ByVal lpKeyName As Any, ByVal lsString As Any, ByVal lplFilename As String) As Long

Declare Function GetPrivateProfileInt Lib "Kernel32" Alias "GetPriviteProfileIntA" (ByVal 
lpApplicationname As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long

Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" (ByVal 
lpApplicationname As String, ByVal lpKeyName As String, ByVal lpDefault As String, 
ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As 
Long

Global File
Global appname
Global Keyname
Global Value

Public Function Store(File As String, Heading As String, Section As String, Value As String)
Dim lpAppName As String, lpFileName As String, lpKeyName As String, lpString As 
String
Dim U As Long
lpAppName = Heading
lpKeyName = Section
lpString = Value
lpFileName = File
U = WritePrivateProfileString(lpAppName, lpKeyName, lpString, lpFileName)
If U = 0 Then
Beep
Else
Store = "Success"
End If
End Function

Public Function GetValue(File As String, Heading As String, Section As String)
Dim x As Long
Dim Temp As String * 50
Dim lpAppName As String, lpKeyName As String, lpDefault As String, lpFileName As String
Temp = Space$(50)
lpAppName = Heading
lpKeyName = Section
lpDefault = no
lpFileName = File

x = GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, Temp, Len(Temp), lpFileName)

If x = 0 Then
Beep
Else
en = InStr(1, Temp, Chr$(0))
If en > 0 Then Temp = Mid$(Temp, 1, en - 1)
GetValue = Trim$(Temp)
End If
End Function 



Un controllo ListView in modalitα ôreportö


Sovente capita di realizzare delle applicazioni in cui Φ necessario utilizzare un cotrollo ListView, in modalitα Report, per la visualizzazione dei dati. Purtroppo non Φ possibile editare gli stessi come la stessa semplicitα di un DataGrid.
Il tip proposto consente di "eliminare" questo problema visualizzando un controllo ComboBox all'interno di una colonna di una riga selezionata, quando si fa click sul controllo ListView, dando la possibilitα di cambiare il valore di un item, scegliendo tra una delle voci proposte dal ComboBox visualizzato.
Con la stessa tecnica Φ possibile aggiungere altri controlli standard come ProgressBar, Command Buttons, ecc.
Trovate lÆapplicazione completa allegata al cd-rom che accompagna la rivista o nella sezione download del sito www.ioprogrammo.it
Tip fornito dal sig. P.Libro


Un risolutore dÆespressioni matematiche


Il codice riportato Φ un risolutore dÆespressioni matematiche numeriche (non letterali e non equazioni). Rispetta le prioritα delle operazioni (prima potenze e radici, poi moltiplicazioni e divisioni ed in ultimo addizioni e sottrazioni).
E' possibile utilizzare vari livelli di parentesi ma solo parentesi tonde. Supporta le funzioni matematiche standard di Visual Basic. E' progettato per poter funzionare con il separatore decimale ma anche con la virgola.
La funzione "Simple" risolve le espressioni senza parentesi. La funzione principale "Solve" estrae il contenuto delle parentesi e lo fa risolvere alla funzione "Simple".
Impostando "ShowPassages" su "True" saranno restituiti i passaggi compiuti dalla funzione per risolvere l'espressione.
Trovate le funzioni, definite in modulo .BAS, allegato al cd-rom che accompagna la rivista o nella sezione download del sito www.ioprogrammo.it
Tip fornito dal sig. S. Tomaselli